/**
 * 题目链接：https://www.luogu.com.cn/problem/P3368
 * 思路解析：使用树状数组，维护一个差分数组的前缀和
 */
#include <iostream>
#define lowbit(x) (x & (-x))
using namespace std;
const int MAX = 5e5 + 7;
// n 代表该列数字个数，m 代表操作数, tree 代表树状数组，同时这也是一个差分数组
int n, m, tree[MAX], a[MAX];
/**
 * @brief 树状数组更新函数
 *
 * @param i 下标索引
 * @param x 插入数据
 */
void update(int i, int x) {
  for (int pos = i; pos <= n; pos += lowbit(pos)) {
    tree[pos] += x;
  }
}
/**
 * @brief 树状数组查询函数
 *
 * @param x 查询(0, x] 这个区间的数值和
 * @return int
 */
int query(int x) {
  int res = 0;
  for (int pos = x; pos > 0; pos -= lowbit(pos)) {
    res += tree[pos];
  }
  return res;
}

int main() {
  // 其中 flag 表示操作
  int flag, x, y, k;
  cin >> n >> m;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    update(i, a[i] - a[i - 1]);
  }

  for (int i = 1; i <= m; ++i) {
    cin >> flag;
    if (flag == 1) {
      cin >> x >> y >> k;
      update(x, k);
      if (y < n)
        update(y + 1, -k);
    } else {
      cin >> x;
      cout << query(x) << endl;
    }
  }

  return 0;
}